/**
 * Founder
 * KentDataAccessorFactory.java
 */
package com.iori.common.db;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.torque.TorqueException;

import com.iori.common.db.dbctrl.DBController;
import com.iori.common.db.dbctrl.DataAccessor;
import com.iori.common.db.dbctrl.SqlListCollection;
import com.iori.common.exception.NetFWException;

/**
 * [クラス名]<br>
 * DataAccessorを取得するクラスのファクトリクラス<br>
 * <br>
 * [機能概要]<br>
 * データアクセス関連の初期化処理を行う。<br>
 * DataAccessorのインスタンスを生成する。<br>
 * <br>
 * [変更履歴]<br>
 * 2006/07/16 ver1.00 新規作成 zhanjc<br>
 *
 * @author zhanjc
 * @version 1.00
 */
public class DataAccessorFactory {

	/**
	 * ログ出力用
	 */
	protected static Log logger = LogFactory.getLog(DataAccessorFactory.class);

	/**
	 * SQLListの設定ファイル名
	 */
	private static final String SQLLIST_CONFIG_FILE_NAME = "sqllist";

	/**
	 * SQLリストコレクションで管理するSQLリスト名。
	 */
	public static final String SQLLIST_NAME = "sqllist.name";

	/**
	 * 何もしないコンストラクタ。（隠蔽される）
	 */
	private DataAccessorFactory() {
	}

	/**
	 * DBアクセスに使用されるDataAccessorのインスタンスを返す。
	 *
	 * @param sqlId
	 *            使用するSQLのID
	 *
	 * @return DataAccessor DataAccessorのインスタンスを戻る
	 */
	public static DataAccessor getDataAccessor(String sqlId) throws Exception {
		DataAccessor result = null;

		try {
			// 新しいデータアクセスクラスを戻る
			result = new DataAccessor(DBEnvConstant.getConfig(SQLLIST_NAME),
					sqlId, DBEnvConstant.getConfig(DBEnvConstant.DATABASE_NAME));
		} catch (Exception e) {
			logger.error(e.getMessage());
			throw e;
		}
		return result;
	}

	/**
	 * {zhanjc 需要變更數據庫schema的才用,爲了防止程序員不小心使用，因此public-->protected}
	 * DBアクセスに使用されるDataAccessorのインスタンスを返す。
	 *
	 * @param sqlId
	 *            使用するSQLのID
	 * @param schemaName
	 *            スキーマ名
	 *
	 * @return DataAccessor DataAccessorのインスタンスを戻る
	 */
	protected static DataAccessor getDataAccessor(String sqlId,
			String schemaName) throws Exception {
		DataAccessor result = null;

		try {
			// 新しいデータアクセスクラスを戻る
			result = new DataAccessor(DBEnvConstant.getConfig(SQLLIST_NAME),
					sqlId,
					DBEnvConstant.getConfig(DBEnvConstant.DATABASE_NAME),
					schemaName);
		} catch (Exception e) {
			logger.error(e.getMessage());
			throw e;
		}
		return result;
	}

	/**
	 * DBアクセスに使用されるgetDataAccessorExのインスタンスを返す。
	 *
	 * @param sqlId
	 *            使用するSQLのID
	 * @param databaseName
	 *            databaseのname
	 *
	 * @return DataAccessor DataAccessorのインスタンスを戻る
	 */
	public static DataAccessor getDataAccessorEx(String sqlId,
			String databaseName) throws Exception {
		DataAccessor result = null;
		try {
			// 新しいデータアクセスクラスを戻る
			result = new DataAccessor(DBEnvConstant.getConfig(SQLLIST_NAME),
					sqlId, databaseName);
		} catch (Exception e) {
			logger.error(e.getMessage());
			throw e;
		}
		return result;
	}

	/**
	 * データアクセス関連の初期化処理を行う。
	 *
	 */
	public static void init() throws NetFWException {

		try {
			// データベースにアクセスするパラメータの設定
			DBController.init();
			// SQL文のパスの設定
			SqlListCollection.init();
			// SQLリストの設定
			SqlListCollection.put(DBEnvConstant.getConfig(SQLLIST_NAME),
					SQLLIST_CONFIG_FILE_NAME);
		} catch (TorqueException e) {
			logger.error("データアクセス関連の初期化処理:Error!");
			throw new NetFWException("FW001", e);// TODO: add dataInfo
		}
	}

	/**
	 * データアクセス関連の終了処理を行う。
	 *
	 */
	public static void destroy() {

		// 指定されたキーワード（業務名）のsqllistを破棄します。
		SqlListCollection.reset(DBEnvConstant
				.getConfig(DataAccessorFactory.SQLLIST_NAME));

		// Torqueのshutdownメソッドを呼び出し、データベースアクセスの終了処理を行う。
		DBController.shutdown();
	}
}
